1*751a7a5dSPaolo Bonzini /* 2*751a7a5dSPaolo Bonzini * libqos driver framework 3*751a7a5dSPaolo Bonzini * 4*751a7a5dSPaolo Bonzini * Copyright (c) 2019 Red Hat, Inc. 5*751a7a5dSPaolo Bonzini * 6*751a7a5dSPaolo Bonzini * Author: Paolo Bonzini <pbonzini@redhat.com> 7*751a7a5dSPaolo Bonzini * 8*751a7a5dSPaolo Bonzini * This library is free software; you can redistribute it and/or 9*751a7a5dSPaolo Bonzini * modify it under the terms of the GNU Lesser General Public 10*751a7a5dSPaolo Bonzini * License version 2 as published by the Free Software Foundation. 11*751a7a5dSPaolo Bonzini * 12*751a7a5dSPaolo Bonzini * This library is distributed in the hope that it will be useful, 13*751a7a5dSPaolo Bonzini * but WITHOUT ANY WARRANTY; without even the implied warranty of 14*751a7a5dSPaolo Bonzini * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 15*751a7a5dSPaolo Bonzini * Lesser General Public License for more details. 16*751a7a5dSPaolo Bonzini * 17*751a7a5dSPaolo Bonzini * You should have received a copy of the GNU Lesser General Public 18*751a7a5dSPaolo Bonzini * License along with this library; if not, see <http://www.gnu.org/licenses/> 19*751a7a5dSPaolo Bonzini */ 20*751a7a5dSPaolo Bonzini 21*751a7a5dSPaolo Bonzini #include "qemu/osdep.h" 22*751a7a5dSPaolo Bonzini #include "libqtest.h" 23*751a7a5dSPaolo Bonzini #include "libqos/malloc.h" 24*751a7a5dSPaolo Bonzini #include "libqos/qgraph.h" 25*751a7a5dSPaolo Bonzini #include "libqos/i2c.h" 26*751a7a5dSPaolo Bonzini 27*751a7a5dSPaolo Bonzini #define ARM_PAGE_SIZE 4096 28*751a7a5dSPaolo Bonzini #define IMX25_PDK_RAM_START 0x80000000 29*751a7a5dSPaolo Bonzini #define IMX25_PDK_RAM_END 0x88000000 30*751a7a5dSPaolo Bonzini 31*751a7a5dSPaolo Bonzini typedef struct QIMX25PDKMachine QIMX25PDKMachine; 32*751a7a5dSPaolo Bonzini 33*751a7a5dSPaolo Bonzini struct QIMX25PDKMachine { 34*751a7a5dSPaolo Bonzini QOSGraphObject obj; 35*751a7a5dSPaolo Bonzini QGuestAllocator alloc; 36*751a7a5dSPaolo Bonzini IMXI2C i2c_1; 37*751a7a5dSPaolo Bonzini }; 38*751a7a5dSPaolo Bonzini 39*751a7a5dSPaolo Bonzini static void *imx25_pdk_get_driver(void *object, const char *interface) 40*751a7a5dSPaolo Bonzini { 41*751a7a5dSPaolo Bonzini QIMX25PDKMachine *machine = object; 42*751a7a5dSPaolo Bonzini if (!g_strcmp0(interface, "memory")) { 43*751a7a5dSPaolo Bonzini return &machine->alloc; 44*751a7a5dSPaolo Bonzini } 45*751a7a5dSPaolo Bonzini 46*751a7a5dSPaolo Bonzini fprintf(stderr, "%s not present in arm/imx25_pdk\n", interface); 47*751a7a5dSPaolo Bonzini g_assert_not_reached(); 48*751a7a5dSPaolo Bonzini } 49*751a7a5dSPaolo Bonzini 50*751a7a5dSPaolo Bonzini static QOSGraphObject *imx25_pdk_get_device(void *obj, const char *device) 51*751a7a5dSPaolo Bonzini { 52*751a7a5dSPaolo Bonzini QIMX25PDKMachine *machine = obj; 53*751a7a5dSPaolo Bonzini if (!g_strcmp0(device, "imx.i2c")) { 54*751a7a5dSPaolo Bonzini return &machine->i2c_1.obj; 55*751a7a5dSPaolo Bonzini } 56*751a7a5dSPaolo Bonzini 57*751a7a5dSPaolo Bonzini fprintf(stderr, "%s not present in arm/imx25_pdk\n", device); 58*751a7a5dSPaolo Bonzini g_assert_not_reached(); 59*751a7a5dSPaolo Bonzini } 60*751a7a5dSPaolo Bonzini 61*751a7a5dSPaolo Bonzini static void imx25_pdk_destructor(QOSGraphObject *obj) 62*751a7a5dSPaolo Bonzini { 63*751a7a5dSPaolo Bonzini QIMX25PDKMachine *machine = (QIMX25PDKMachine *) obj; 64*751a7a5dSPaolo Bonzini alloc_destroy(&machine->alloc); 65*751a7a5dSPaolo Bonzini } 66*751a7a5dSPaolo Bonzini 67*751a7a5dSPaolo Bonzini static void *qos_create_machine_arm_imx25_pdk(QTestState *qts) 68*751a7a5dSPaolo Bonzini { 69*751a7a5dSPaolo Bonzini QIMX25PDKMachine *machine = g_new0(QIMX25PDKMachine, 1); 70*751a7a5dSPaolo Bonzini 71*751a7a5dSPaolo Bonzini alloc_init(&machine->alloc, 0, 72*751a7a5dSPaolo Bonzini IMX25_PDK_RAM_START, 73*751a7a5dSPaolo Bonzini IMX25_PDK_RAM_END, 74*751a7a5dSPaolo Bonzini ARM_PAGE_SIZE); 75*751a7a5dSPaolo Bonzini machine->obj.get_device = imx25_pdk_get_device; 76*751a7a5dSPaolo Bonzini machine->obj.get_driver = imx25_pdk_get_driver; 77*751a7a5dSPaolo Bonzini machine->obj.destructor = imx25_pdk_destructor; 78*751a7a5dSPaolo Bonzini 79*751a7a5dSPaolo Bonzini imx_i2c_init(&machine->i2c_1, qts, 0x43f80000); 80*751a7a5dSPaolo Bonzini return &machine->obj; 81*751a7a5dSPaolo Bonzini } 82*751a7a5dSPaolo Bonzini 83*751a7a5dSPaolo Bonzini static void imx25_pdk_register_nodes(void) 84*751a7a5dSPaolo Bonzini { 85*751a7a5dSPaolo Bonzini QOSGraphEdgeOptions edge = { 86*751a7a5dSPaolo Bonzini .extra_device_opts = "bus=i2c-bus.0" 87*751a7a5dSPaolo Bonzini }; 88*751a7a5dSPaolo Bonzini qos_node_create_machine("arm/imx25-pdk", qos_create_machine_arm_imx25_pdk); 89*751a7a5dSPaolo Bonzini qos_node_contains("arm/imx25-pdk", "imx.i2c", &edge, NULL); 90*751a7a5dSPaolo Bonzini } 91*751a7a5dSPaolo Bonzini 92*751a7a5dSPaolo Bonzini libqos_init(imx25_pdk_register_nodes); 93