From patchwork Tue Sep 10 19:33:45 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Patchwork-Submitter: Laurent Vivier X-Patchwork-Id: 1160541 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Authentication-Results: ozlabs.org; spf=pass (mailfrom) smtp.mailfrom=nongnu.org (client-ip=209.51.188.17; helo=lists.gnu.org; envelope-from=qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org; receiver=) Authentication-Results: ozlabs.org; dmarc=none (p=none dis=none) header.from=vivier.eu Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ozlabs.org (Postfix) with ESMTPS id 46Sb20136bz9s4Y for ; Wed, 11 Sep 2019 05:39:04 +1000 (AEST) Received: from localhost ([::1]:44444 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i7lyf-0005V1-NM for incoming@patchwork.ozlabs.org; Tue, 10 Sep 2019 15:39:01 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:59118) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1i7luK-0001FV-Qn for qemu-devel@nongnu.org; Tue, 10 Sep 2019 15:34:34 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1i7luJ-0006v7-4u for qemu-devel@nongnu.org; Tue, 10 Sep 2019 15:34:32 -0400 Received: from mout.kundenserver.de ([217.72.192.74]:59847) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1i7luI-0006uS-R2; Tue, 10 Sep 2019 15:34:31 -0400 Received: from localhost.localdomain ([78.238.229.36]) by mrelayeu.kundenserver.de (mreue106 [212.227.15.183]) with ESMTPSA (Nemesis) id 1M1INQ-1i9PWb3occ-002kaC; Tue, 10 Sep 2019 21:34:04 +0200 From: Laurent Vivier To: qemu-devel@nongnu.org Date: Tue, 10 Sep 2019 21:33:45 +0200 Message-Id: <20190910193347.16000-8-laurent@vivier.eu> X-Mailer: git-send-email 2.21.0 In-Reply-To: <20190910193347.16000-1-laurent@vivier.eu> References: <20190910193347.16000-1-laurent@vivier.eu> MIME-Version: 1.0 X-Provags-ID: V03:K1:ywfP9Je1QGv2YW2SL3SYzkciLTYOti0qiJaFdqAowo5K4o2K8He UXrouTDOZ1c9F9LPGAbicg31xG0N+IBfhJwXcq6PYR0/iQI4JCnT9/CJF/vZWB8+m3liuqt e47abw250acl1zY5/0ZDY+wEzoqVfQRHVTCCbGGVGG6hwBDquzQIOK9gx67WU2BZgxpjEaj pnafZOzIznbXIaqiX9eqQ== X-UI-Out-Filterresults: notjunk:1; V03:K0:L20w+FYEqV8=:8UWIk8j3GBLqGAzK4vkUjh 3+kNsyI9GScaPto0VCEH4cCbvPpHFpSfLUWqaKL/k7wGb5yG7DMymgmie09UmrQzya7pmnuJK eHLH1hRr7EIJ/oX+SyfUngS01ZSc8SPLBHULpuGrpTfzLJTR371y0YeXFixLPGsdrSzzvYIvl M2iEDRUAdWfJlrxqjfBotkU4mik8ALOPR9E22jyEVXFonJlVAAYOahrE9cbZt9pJAjhl8JQT5 FbxeLuPTP5Zo9hyo+ALb4rO0kqfOT29Rxv+FUP8H/nE43zgQXvrIRPum6xsnER2bKyq6FpiO0 sfy1Yl0rrAyh4+NMTnGb3HfDKeGUzUw4MMvdrxPbVlXSTppHdedwgcngQvDgR6FgLCe9mVyuK wvqhGcuz+azzo5ToSegk3YtPqrRWzTsjwtvDhIlaMNZyqhgo5D1numnlJNq9yayzDJ9XmZCHi INba4acrmaiwz2+FBkmytG5Fes1sFNH1vqyyAzClF6NbN9ipkWjkE8Bzycdus16i00YgCsivV JeyvfM5pgqb8LiYCJvBhsdy7uizK3ADu4bAKB0Qi40eSp+/srjvlbSFYVtJxvxt1afXF5HLmR YXcY7iMnu7/bH7j/F/WXKfZ7f+7mIn6SCCr6vmaVPuhtITV1mAoRhgc5gWoP9/JZE6onkecvF 3VUe0bYiS1E1Mejl9GiVONs7pxc3uStc8AH+uytZCOMuIna76XXDBr3QZrY8NP2b34NEs1x9V C/YZP0+3nvLQZBfMnx2hvCcD92neMGRMupqvkWzb8YHN6kk9L2izxTEuQC/RhReiQz1xgObya TQQOX6zLAFKInXL0+YHMHHZ+oTr+CPR4UdbZCl5/vv5d39vtXs= X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 217.72.192.74 Subject: [Qemu-devel] [PATCH v11 7/9] hw/m68k: add Nubus support for macfb video card X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Kevin Wolf , Fam Zheng , qemu-block@nongnu.org, Thomas Huth , Jason Wang , Mark Cave-Ayland , "Dr . David Alan Gilbert" , Max Reitz , =?utf-8?q?Herv=C3=A9_Poussineau?= , Gerd Hoffmann , =?utf-8?q?Marc-Andr=C3=A9_Lureau?= , Paolo Bonzini , Aurelien Jarno , Laurent Vivier Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: "Qemu-devel" From: Mark Cave-Ayland Co-developed-by: Mark Cave-Ayland Signed-off-by: Mark Cave-Ayland Signed-off-by: Laurent Vivier Reviewed-by: Hervé Poussineau --- hw/display/Kconfig | 1 + hw/display/macfb.c | 56 ++++++++++++++++++++++++++++++++++++++ include/hw/display/macfb.h | 21 ++++++++++++++ 3 files changed, 78 insertions(+) diff --git a/hw/display/Kconfig b/hw/display/Kconfig index 32e8d29003..c500d1fc6d 100644 --- a/hw/display/Kconfig +++ b/hw/display/Kconfig @@ -136,3 +136,4 @@ config ATI_VGA config MACFB bool select FRAMEBUFFER + depends on NUBUS diff --git a/hw/display/macfb.c b/hw/display/macfb.c index d7c5ef296e..f4fa8e3206 100644 --- a/hw/display/macfb.c +++ b/hw/display/macfb.c @@ -15,6 +15,7 @@ #include "hw/sysbus.h" #include "ui/console.h" #include "ui/pixel_ops.h" +#include "hw/nubus/nubus.h" #include "hw/display/macfb.h" #include "qapi/error.h" #include "hw/qdev-properties.h" @@ -382,12 +383,38 @@ static void macfb_sysbus_realize(DeviceState *dev, Error **errp) sysbus_init_mmio(SYS_BUS_DEVICE(s), &ms->mem_vram); } +const uint8_t macfb_rom[] = { + 255, 0, 0, 0, +}; + +static void macfb_nubus_realize(DeviceState *dev, Error **errp) +{ + NubusDevice *nd = NUBUS_DEVICE(dev); + MacfbNubusState *s = NUBUS_MACFB(dev); + MacfbNubusDeviceClass *ndc = MACFB_NUBUS_GET_CLASS(dev); + MacfbState *ms = &s->macfb; + + ndc->parent_realize(dev, errp); + + macfb_common_realize(dev, ms, errp); + memory_region_add_subregion(&nd->slot_mem, DAFB_BASE, &ms->mem_ctrl); + memory_region_add_subregion(&nd->slot_mem, VIDEO_BASE, &ms->mem_vram); + + nubus_register_rom(nd, macfb_rom, sizeof(macfb_rom), 1, 9, 0xf); +} + static void macfb_sysbus_reset(DeviceState *d) { MacfbSysBusState *s = MACFB(d); macfb_reset(&s->macfb); } +static void macfb_nubus_reset(DeviceState *d) +{ + MacfbNubusState *s = NUBUS_MACFB(d); + macfb_reset(&s->macfb); +} + static Property macfb_sysbus_properties[] = { DEFINE_PROP_UINT32("width", MacfbSysBusState, macfb.width, 640), DEFINE_PROP_UINT32("height", MacfbSysBusState, macfb.height, 480), @@ -395,6 +422,13 @@ static Property macfb_sysbus_properties[] = { DEFINE_PROP_END_OF_LIST(), }; +static Property macfb_nubus_properties[] = { + DEFINE_PROP_UINT32("width", MacfbNubusState, macfb.width, 640), + DEFINE_PROP_UINT32("height", MacfbNubusState, macfb.height, 480), + DEFINE_PROP_UINT8("depth", MacfbNubusState, macfb.depth, 8), + DEFINE_PROP_END_OF_LIST(), +}; + static void macfb_sysbus_class_init(ObjectClass *klass, void *data) { DeviceClass *dc = DEVICE_CLASS(klass); @@ -406,6 +440,19 @@ static void macfb_sysbus_class_init(ObjectClass *klass, void *data) dc->props = macfb_sysbus_properties; } +static void macfb_nubus_class_init(ObjectClass *klass, void *data) +{ + DeviceClass *dc = DEVICE_CLASS(klass); + MacfbNubusDeviceClass *ndc = MACFB_NUBUS_DEVICE_CLASS(klass); + + device_class_set_parent_realize(dc, macfb_nubus_realize, + &ndc->parent_realize); + dc->desc = "Nubus Macintosh framebuffer"; + dc->reset = macfb_nubus_reset; + dc->vmsd = &vmstate_macfb; + dc->props = macfb_nubus_properties; +} + static TypeInfo macfb_sysbus_info = { .name = TYPE_MACFB, .parent = TYPE_SYS_BUS_DEVICE, @@ -413,9 +460,18 @@ static TypeInfo macfb_sysbus_info = { .class_init = macfb_sysbus_class_init, }; +static TypeInfo macfb_nubus_info = { + .name = TYPE_NUBUS_MACFB, + .parent = TYPE_NUBUS_DEVICE, + .instance_size = sizeof(MacfbNubusState), + .class_init = macfb_nubus_class_init, + .class_size = sizeof(MacfbNubusDeviceClass), +}; + static void macfb_register_types(void) { type_register_static(&macfb_sysbus_info); + type_register_static(&macfb_nubus_info); } type_init(macfb_register_types) diff --git a/include/hw/display/macfb.h b/include/hw/display/macfb.h index 3fe2592735..26367ae2c4 100644 --- a/include/hw/display/macfb.h +++ b/include/hw/display/macfb.h @@ -40,4 +40,25 @@ typedef struct { MacfbState macfb; } MacfbSysBusState; +#define MACFB_NUBUS_DEVICE_CLASS(class) \ + OBJECT_CLASS_CHECK(MacfbNubusDeviceClass, (class), TYPE_NUBUS_MACFB) +#define MACFB_NUBUS_GET_CLASS(obj) \ + OBJECT_GET_CLASS(MacfbNubusDeviceClass, (obj), TYPE_NUBUS_MACFB) + +typedef struct MacfbNubusDeviceClass { + DeviceClass parent_class; + + DeviceRealize parent_realize; +} MacfbNubusDeviceClass; + +#define TYPE_NUBUS_MACFB "nubus-macfb" +#define NUBUS_MACFB(obj) \ + OBJECT_CHECK(MacfbNubusState, (obj), TYPE_NUBUS_MACFB) + +typedef struct { + NubusDevice busdev; + + MacfbState macfb; +} MacfbNubusState; + #endif