Subject: more PCI expansion rom stuff (macro declarations)
To: Allen Briggs <briggs@ninthwonder.com>
From: Garrett D'Amore <garrett_damore@tadpole.com>
List: tech-kern
Date: 02/27/2006 19:50:51
This is a multi-part message in MIME format.
--------------080509040508030202010901
Content-Type: text/plain; charset=ISO-8859-1
Content-Transfer-Encoding: 7bit
I want to include the attached structure and macro declarations which
describe the format of data in PCI expansion ROMs into pcireg.h.
I have considered also providing a standard function to parse (locate)
the matching ROM image, but it isn't clear that there is a truly elegant
way to do this. I have code to do it in my radeonfb driver. If you
want it generalized, I'm happy to add the code to pci_subr.c as well.
Here is the API that I would initially propose in that case:
int pci_find_rom(struct pci_attach_args *, bus_space_tag_t *,
bus_space_handle_t *,
bus_size_t, int code, bus_space_handle_t *subhandle);
And the caller would do something like this (error checking elided for
clarity):
pci_mapreg_map(paa, PCI_MAPREG_TYPE_ROM, PCI_MAPREG_ROM, 0, &sc->sc_romt,
&sc->sc_romh, &sc->sc_romsz);
pci_find_rom(paa, sc->sc_romt, sc->sc_romh, PCI_ROM_CODE_TYPE_X86,
&sc->sc_biosh);
where tag and primary handle are just like pci_mapreg_map
Anyway, please let me know if you think I can commit the pcireg.h
changes, and also if you're interested in having a new pci_find_rom()
code in the common PCI framework.
-- Garrett
--------------080509040508030202010901
Content-Type: text/x-patch;
name="pcirom.diff"
Content-Transfer-Encoding: 7bit
Content-Disposition: inline;
filename="pcirom.diff"
Index: pcireg.h
===================================================================
RCS file: /cvsroot/src/sys/dev/pci/pcireg.h,v
retrieving revision 1.48
diff -u -r1.48 pcireg.h
--- pcireg.h 27 Feb 2006 16:11:58 -0000 1.48
+++ pcireg.h 28 Feb 2006 03:49:48 -0000
@@ -702,6 +702,42 @@
*/
/*
+ * PCI Expansion Rom
+ */
+
+struct pci_rom_header {
+ uint16_t romh_magic; /* 0xAA55 little endian */
+ uint8_t romh_reserved[22];
+ uint16_t romh_data_ptr; /* pointer to pci_rom struct */
+} __attribute__((__packed__));
+
+#define PCI_ROM_HEADER_MAGIC 0xAA55 /* little endian */
+
+struct pci_rom {
+ uint32_t rom_signature;
+ pci_vendor_id_t rom_vendor;
+ pci_product_id_t rom_product;
+ uint16_t rom_vpd_ptr; /* reserved in PCI 2.2 */
+ uint16_t rom_data_len;
+ uint8_t rom_data_rev;
+ pci_class_t rom_class;
+ pci_subclass_t rom_subclass;
+ pci_interface_t rom_interface;
+ uint16_t rom_len; /* code length / 512 byte */
+ uint16_t rom_rev; /* code revision level */
+ uint8_t rom_code_type; /* type of code */
+ uint8_t rom_indicator;
+ uint16_t rom_reserved;
+ /* Actual data. */
+} __attribute__((__packed__));
+
+#define PCI_ROM_SIGNATURE 0x52494350 /* "PCIR", endian reversed */
+#define PCI_ROM_CODE_TYPE_X86 0 /* Intel x86 BIOS */
+#define PCI_ROM_CODE_TYPE_OFW 1 /* Open Firmware */
+#define PCI_ROM_CODE_TYPE_HPPA 2 /* HP PA/RISC */
+
+/*
+/*
* Threshold below which 32bit PCI DMA needs bouncing.
*/
#define PCI32_DMA_BOUNCE_THRESHOLD 0x100000000ULL
--------------080509040508030202010901--