| // Copyright 2019 The Fuchsia Authors. All rights reserved. |
| // Use of this source code is governed by a BSD-style license that can be |
| // found in the LICENSE file. |
| |
| #include <lib/mmio/mmio.h> |
| |
| #include <array> |
| |
| #include <fbl/algorithm.h> |
| #include <soc/mt8183/mt8183-hw.h> |
| |
| #include "c18.h" |
| |
| namespace board_c18 { |
| |
| namespace { |
| |
| constexpr size_t kNumberOfPolarityRegisters = 10; |
| constexpr uint32_t GetRegister(size_t offset) { |
| // 1 to invert from Low to High, 0 is either already High or a reserved interrupt |
| constexpr bool L = true; |
| constexpr bool H = false; |
| constexpr bool R = false; |
| // Start from interrupt 32 (first SPI after 32 PPIs) |
| constexpr std::array<bool, kNumberOfPolarityRegisters* 32> spi_polarities = { |
| L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, // 32 |
| L, L, L, L, L, L, L, L, H, L, H, L, L, L, L, L, // 48 |
| L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, // 64 |
| L, L, L, L, L, L, L, L, H, H, H, H, L, L, L, L, // 80 |
| H, H, H, H, H, H, H, H, L, L, L, L, L, L, L, L, // 96 |
| L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, // 112 |
| L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, // 128 |
| L, L, L, L, L, L, L, L, L, H, H, H, L, L, L, L, // 144 |
| L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, // 160 |
| L, L, R, L, H, H, H, L, L, L, L, H, L, L, H, H, // 176 |
| R, L, L, L, R, R, L, L, R, L, H, L, L, H, H, H, // 192 |
| L, H, H, L, L, H, H, H, H, H, L, L, L, L, L, L, // 208 |
| L, L, L, L, L, H, R, H, H, H, H, H, H, H, H, H, // 224 |
| H, H, H, H, H, H, H, H, H, L, L, L, L, L, L, L, // 240 |
| L, L, L, L, L, L, L, L, L, L, L, L, L, L, R, L, // 256 |
| L, L, L, L, L, R, R, L, L, L, L, L, L, L, L, L, // 272 |
| L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, // 288 |
| L, L, L, L, L, L, L, L, L, L, L, L, L, L, L, H, // 304 |
| L, L, L, L, L, L, R, L, R, R, R, R, R, R, R, L // 320 |
| }; |
| |
| uint32_t temporary_register = 0; |
| for (size_t j = 0; j < 32; ++j) { |
| temporary_register |= static_cast<uint32_t>(spi_polarities[offset + j]) << j; |
| } |
| return temporary_register; |
| } |
| |
| } // namespace |
| |
| zx_status_t C18::SocInit() { |
| zx_status_t status; |
| mmio_buffer_t mmio; |
| status = mmio_buffer_init_physical( |
| &mmio, MT8183_MCUCFG_BASE, MT8183_MCUCFG_SIZE, |
| // Please do not use get_root_resource() in new code (fxbug.dev/31358). |
| get_root_resource(), ZX_CACHE_POLICY_UNCACHED_DEVICE); |
| if (status != ZX_OK) { |
| zxlogf(ERROR, "%s: mmio_buffer_init_physical failed %d ", __PRETTY_FUNCTION__, status); |
| return status; |
| } |
| ddk::MmioBuffer mmio2(mmio); |
| |
| // Convert Level interrupt polarity in SOC from Low to High as needed by gicv3. |
| for (size_t i = 0; i < kNumberOfPolarityRegisters; ++i) { |
| // 32 interrupts per register, one register every 4 bytes. |
| mmio2.Write32(GetRegister(i * 32), MT8183_MCUCFG_INT_POL_CTL0 + i * 4); |
| } |
| return ZX_OK; |
| } |
| |
| } // namespace board_c18 |