xref: /dflybsd-src/sys/dev/acpica/Osd/OsdHardware.c (revision 38b5d46cbbb58bd340296ebede89d5f6b4838f4f)
15db2f26eSSascha Wildner /*-
25db2f26eSSascha Wildner  * Copyright (c) 2000, 2001 Michael Smith
35db2f26eSSascha Wildner  * Copyright (c) 2000 BSDi
45db2f26eSSascha Wildner  * All rights reserved.
55db2f26eSSascha Wildner  *
65db2f26eSSascha Wildner  * Redistribution and use in source and binary forms, with or without
75db2f26eSSascha Wildner  * modification, are permitted provided that the following conditions
85db2f26eSSascha Wildner  * are met:
95db2f26eSSascha Wildner  * 1. Redistributions of source code must retain the above copyright
105db2f26eSSascha Wildner  *    notice, this list of conditions and the following disclaimer.
115db2f26eSSascha Wildner  * 2. Redistributions in binary form must reproduce the above copyright
125db2f26eSSascha Wildner  *    notice, this list of conditions and the following disclaimer in the
135db2f26eSSascha Wildner  *    documentation and/or other materials provided with the distribution.
145db2f26eSSascha Wildner  *
155db2f26eSSascha Wildner  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
165db2f26eSSascha Wildner  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
175db2f26eSSascha Wildner  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
185db2f26eSSascha Wildner  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
195db2f26eSSascha Wildner  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
205db2f26eSSascha Wildner  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
215db2f26eSSascha Wildner  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
225db2f26eSSascha Wildner  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
235db2f26eSSascha Wildner  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
245db2f26eSSascha Wildner  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
255db2f26eSSascha Wildner  * SUCH DAMAGE.
265db2f26eSSascha Wildner  *
275db2f26eSSascha Wildner  * $FreeBSD: src/sys/dev/acpica/Osd/OsdHardware.c,v 1.13 2004/04/14 03:39:08 njl Exp $
285db2f26eSSascha Wildner  */
295db2f26eSSascha Wildner 
305db2f26eSSascha Wildner /*
31178f054bSSascha Wildner  * Hardware Abstraction
325db2f26eSSascha Wildner  */
335db2f26eSSascha Wildner 
345db2f26eSSascha Wildner #include "acpi.h"
355db2f26eSSascha Wildner 
365db2f26eSSascha Wildner #include <sys/bus.h>
375db2f26eSSascha Wildner #include <bus/pci/pci_cfgreg.h>
385db2f26eSSascha Wildner #include <bus/pci/pcireg.h>
395db2f26eSSascha Wildner 
405db2f26eSSascha Wildner /*
415db2f26eSSascha Wildner  * ACPICA's rather gung-ho approach to hardware resource ownership is a little
425db2f26eSSascha Wildner  * troublesome insofar as there is no easy way for us to know in advance
435db2f26eSSascha Wildner  * exactly which I/O resources it's going to want to use.
445db2f26eSSascha Wildner  *
455db2f26eSSascha Wildner  * In order to deal with this, we ignore resource ownership entirely, and simply
465db2f26eSSascha Wildner  * use the native I/O space accessor functionality.  This is Evil, but it works.
475db2f26eSSascha Wildner  *
485db2f26eSSascha Wildner  * XXX use an intermediate #define for the tag/handle
495db2f26eSSascha Wildner  */
505db2f26eSSascha Wildner 
515db2f26eSSascha Wildner #ifdef __x86_64__
525db2f26eSSascha Wildner #define ACPI_BUS_SPACE_IO	X86_64_BUS_SPACE_IO
535db2f26eSSascha Wildner #define ACPI_BUS_HANDLE		0
545db2f26eSSascha Wildner #endif
555db2f26eSSascha Wildner 
565db2f26eSSascha Wildner ACPI_STATUS
AcpiOsReadPort(ACPI_IO_ADDRESS InPort,UINT32 * Value,UINT32 Width)575db2f26eSSascha Wildner AcpiOsReadPort(ACPI_IO_ADDRESS InPort, UINT32 *Value, UINT32 Width)
585db2f26eSSascha Wildner {
595db2f26eSSascha Wildner     switch (Width) {
605db2f26eSSascha Wildner     case 8:
617db43b0aSSascha Wildner 	*Value = bus_space_read_1(ACPI_BUS_SPACE_IO, ACPI_BUS_HANDLE, InPort);
625db2f26eSSascha Wildner 	break;
635db2f26eSSascha Wildner     case 16:
647db43b0aSSascha Wildner 	*Value = bus_space_read_2(ACPI_BUS_SPACE_IO, ACPI_BUS_HANDLE, InPort);
655db2f26eSSascha Wildner 	break;
665db2f26eSSascha Wildner     case 32:
677db43b0aSSascha Wildner 	*Value = bus_space_read_4(ACPI_BUS_SPACE_IO, ACPI_BUS_HANDLE, InPort);
685db2f26eSSascha Wildner 	break;
695db2f26eSSascha Wildner     }
705db2f26eSSascha Wildner 
715db2f26eSSascha Wildner     return (AE_OK);
725db2f26eSSascha Wildner }
735db2f26eSSascha Wildner 
745db2f26eSSascha Wildner ACPI_STATUS
AcpiOsWritePort(ACPI_IO_ADDRESS OutPort,UINT32 Value,UINT32 Width)755db2f26eSSascha Wildner AcpiOsWritePort(ACPI_IO_ADDRESS OutPort, UINT32 Value, UINT32 Width)
765db2f26eSSascha Wildner {
775db2f26eSSascha Wildner     switch (Width) {
785db2f26eSSascha Wildner     case 8:
795db2f26eSSascha Wildner 	bus_space_write_1(ACPI_BUS_SPACE_IO, ACPI_BUS_HANDLE, OutPort, Value);
805db2f26eSSascha Wildner 	break;
815db2f26eSSascha Wildner     case 16:
825db2f26eSSascha Wildner 	bus_space_write_2(ACPI_BUS_SPACE_IO, ACPI_BUS_HANDLE, OutPort, Value);
835db2f26eSSascha Wildner 	break;
845db2f26eSSascha Wildner     case 32:
855db2f26eSSascha Wildner 	bus_space_write_4(ACPI_BUS_SPACE_IO, ACPI_BUS_HANDLE, OutPort, Value);
865db2f26eSSascha Wildner 	break;
875db2f26eSSascha Wildner     }
885db2f26eSSascha Wildner 
895db2f26eSSascha Wildner     return (AE_OK);
905db2f26eSSascha Wildner }
915db2f26eSSascha Wildner 
925db2f26eSSascha Wildner ACPI_STATUS
AcpiOsReadPciConfiguration(ACPI_PCI_ID * PciId,UINT32 Register,UINT64 * Value,UINT32 Width)935db2f26eSSascha Wildner AcpiOsReadPciConfiguration(ACPI_PCI_ID *PciId, UINT32 Register, UINT64 *Value,
945db2f26eSSascha Wildner     UINT32 Width)
955db2f26eSSascha Wildner {
965db2f26eSSascha Wildner     int bytes = Width / 8;
975db2f26eSSascha Wildner 
985db2f26eSSascha Wildner     if (Width == 64)
995db2f26eSSascha Wildner 	return (AE_SUPPORT);
1005db2f26eSSascha Wildner 
1015db2f26eSSascha Wildner     if (!pci_cfgregopen())
1025db2f26eSSascha Wildner 	return (AE_NOT_EXIST);
1035db2f26eSSascha Wildner 
1045db2f26eSSascha Wildner     *Value = pci_cfgregread(PciId->Bus, PciId->Device,
1055db2f26eSSascha Wildner     				      PciId->Function, Register, bytes);
1065db2f26eSSascha Wildner     *Value &= (1 << (bytes * 8)) - 1;
1075db2f26eSSascha Wildner 
1085db2f26eSSascha Wildner     return (AE_OK);
1095db2f26eSSascha Wildner }
1105db2f26eSSascha Wildner 
1115db2f26eSSascha Wildner 
1125db2f26eSSascha Wildner ACPI_STATUS
AcpiOsWritePciConfiguration(ACPI_PCI_ID * PciId,UINT32 Register,UINT64 Value,UINT32 Width)1135db2f26eSSascha Wildner AcpiOsWritePciConfiguration(ACPI_PCI_ID *PciId, UINT32 Register,
1145db2f26eSSascha Wildner     UINT64 Value, UINT32 Width)
1155db2f26eSSascha Wildner {
1165db2f26eSSascha Wildner     if (Width == 64)
1175db2f26eSSascha Wildner 	return (AE_SUPPORT);
1185db2f26eSSascha Wildner 
1195db2f26eSSascha Wildner     if (!pci_cfgregopen())
1205db2f26eSSascha Wildner     	return (AE_NOT_EXIST);
1215db2f26eSSascha Wildner 
1225db2f26eSSascha Wildner     pci_cfgregwrite(PciId->Bus, PciId->Device, PciId->Function, Register,
1233905511eSSascha Wildner     		    (uint32_t)Value, Width / 8); /* XXX casting */
1245db2f26eSSascha Wildner 
1255db2f26eSSascha Wildner     return (AE_OK);
1265db2f26eSSascha Wildner }
127*38b5d46cSSascha Wildner 
128*38b5d46cSSascha Wildner ACPI_STATUS
AcpiOsEnterSleep(UINT8 SleepState,UINT32 RegaValue,UINT32 RegbValue)129*38b5d46cSSascha Wildner AcpiOsEnterSleep (
130*38b5d46cSSascha Wildner     UINT8                   SleepState,
131*38b5d46cSSascha Wildner     UINT32                  RegaValue,
132*38b5d46cSSascha Wildner     UINT32                  RegbValue)
133*38b5d46cSSascha Wildner {
134*38b5d46cSSascha Wildner     return (AE_OK);
135*38b5d46cSSascha Wildner }
136