From 971ad090955be830fc0bb8f5b9e7886230e26d3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Duval?= Date: Mon, 24 Jan 2022 11:27:20 +0100 Subject: [PATCH] pch_i2c: bail out if BAR isn't configured Change-Id: If271dc01bade8a5fcf28c7a3e734d573c0008b04 Reviewed-on: https://review.haiku-os.org/c/haiku/+/4883 Reviewed-by: Adrien Destugues Tested-by: Commit checker robot --- src/add-ons/kernel/busses/i2c/pch_i2c.cpp | 4 ++-- src/add-ons/kernel/busses/i2c/pch_i2c.h | 2 +- src/add-ons/kernel/busses/i2c/pch_i2c_pci.cpp | 8 +++++++- 3 files changed, 10 insertions(+), 4 deletions(-) diff --git a/src/add-ons/kernel/busses/i2c/pch_i2c.cpp b/src/add-ons/kernel/busses/i2c/pch_i2c.cpp index 302c2803e4..ef2ada1a43 100644 --- a/src/add-ons/kernel/busses/i2c/pch_i2c.cpp +++ b/src/add-ons/kernel/busses/i2c/pch_i2c.cpp @@ -403,7 +403,7 @@ init_bus(device_node* node, void** bus_cookie) gDeviceManager->get_driver(parent, &driver, (void**)&bus); gDeviceManager->put_node(parent); - TRACE_ALWAYS("init_bus() addr 0x%" B_PRIxPHYSADDR " size 0x%" B_PRIxSIZE + TRACE_ALWAYS("init_bus() addr 0x%" B_PRIxPHYSADDR " size 0x%" B_PRIx64 " irq 0x%x\n", bus->base_addr, bus->map_size, bus->irq); bus->registersArea = map_physical_memory("PCHI2C memory mapped registers", @@ -412,7 +412,7 @@ init_bus(device_node* node, void** bus_cookie) (void **)&bus->registers); // init bus bus->capabilities = read32(bus->registers + PCH_SUP_CAPABLITIES); - TRACE_ALWAYS("init_bus() 0x%x (0x%" B_PRIx32 ")\n", + TRACE_ALWAYS("init_bus() 0x%" B_PRIx32 " (0x%" B_PRIx32 ")\n", (bus->capabilities >> PCH_SUP_CAPABLITIES_TYPE_SHIFT) & PCH_SUP_CAPABLITIES_TYPE_MASK, bus->capabilities); diff --git a/src/add-ons/kernel/busses/i2c/pch_i2c.h b/src/add-ons/kernel/busses/i2c/pch_i2c.h index 6c64fae3e1..360323e12e 100644 --- a/src/add-ons/kernel/busses/i2c/pch_i2c.h +++ b/src/add-ons/kernel/busses/i2c/pch_i2c.h @@ -72,7 +72,7 @@ typedef enum { typedef struct { phys_addr_t base_addr; - size_t map_size; + uint64 map_size; uint8 irq; i2c_bus sim; diff --git a/src/add-ons/kernel/busses/i2c/pch_i2c_pci.cpp b/src/add-ons/kernel/busses/i2c/pch_i2c_pci.cpp index 3460d7e6e5..c113ca0a77 100644 --- a/src/add-ons/kernel/busses/i2c/pch_i2c_pci.cpp +++ b/src/add-ons/kernel/busses/i2c/pch_i2c_pci.cpp @@ -131,12 +131,18 @@ init_device(device_node* node, void** device_cookie) pci->get_pci_info(device, pciInfo); bus->info.base_addr = pciInfo->u.h0.base_registers[0]; + bus->info.map_size = pciInfo->u.h0.base_register_sizes[0]; if ((pciInfo->u.h0.base_register_flags[0] & PCI_address_type) == PCI_address_type_64) { bus->info.base_addr |= (uint64)pciInfo->u.h0.base_registers[1] << 32; + bus->info.map_size |= (uint64)pciInfo->u.h0.base_register_sizes[1] << 32; } - bus->info.map_size = pciInfo->u.h0.base_register_sizes[0]; + if (bus->info.base_addr == 0) { + ERROR("PCI BAR not assigned\n"); + free(bus); + return B_ERROR; + } // enable power pci->set_powerstate(device, PCI_pm_state_d0);